home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / comm2 / mmafp191.lha / REXX / MM_AreaFixPlus.rexx
OS/2 REXX Batch file  |  1996-03-29  |  56KB  |  1,550 lines

  1. /*
  2. ** $VER: MM_AreaFixPlus 1.91 (24.03.96)
  3. **
  4. ** Written by Paolo Carotenuto
  5. **
  6. */
  7. DROP MM. ; PARSE UPPER ARG MM.Node MM.Mode MM.Command MM.Mail MM.Switch ; MM.LogLevel=2
  8. MM.PrgName='MM_AreaFixPlus v1.91' ; IF MM.Node='?' THEN CALL Usage();ADDRESS 'MAILMANAGER';CALL ReadCfg();IF MM.Node ~='' THEN CALL MuiCli()
  9. DO y=0 FOR MM.Mails.Count ; MM.Mail=MM.Mails.y;MM.Mode='AREAFIX'
  10. DO x=0 FOR MM.AliasAreaFix.Count ; DROP Msg.;MM_SearchMsgs MM.Mail Msg '#?' MM.AliasAreaFix.x '#?' IMP !INTR !SENT
  11. IF Rc=0 THEN;DO;DO z=0 FOR Msg.Count;CALL ProcessaMsg(Msg.z);END;END ; END ; END
  12. DO y=0 FOR MM.Mails.Count
  13. MM.Mail=MM.Mails.y;MM.Mode='RAID'
  14. DO x=0 FOR MM.AliasRaid.Count
  15. DROP Msg.;MM_SearchMsgs MM.Mail Msg '#?' MM.AliasRaid.x '#?' IMP !INTR !SENT
  16. IF Rc=0 THEN;DO;DO z=0 FOR Msg.Count;CALL ProcessaMsg(Msg.z);END;END
  17. END
  18. END
  19. CALL Fine()
  20. ProcessaMsg:PROCEDURE EXPOSE MM.
  21. PARSE ARG MsgNum
  22. MM_ReadMsg MM.Mail MsgNum MM.Msg
  23. IF Rc ~=0 THEN RETURN
  24. PARSE UPPER VAR MM.Msg.Subj MM.Password MM.Switch
  25. MM.FromNode=MM.Msg.FromAddr;MM.FromName=MM.Msg.From
  26. MM.ToNode=MM.Msg.ToAddr;MM.FromFirst=SUBWORD(MM.FromName,1,1)
  27. CALL Init();CALL AddLine(Body,AddReplyKludge(Body))
  28. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  29. MM_GetNodeInfo MM.FromNode MM.Nodo
  30. IF Rc=3 THEN;DO
  31. DO n=0 FOR MM.Unknown.Count
  32. CALL AddLine(Body,Trasforma(MM.Unknown.n))
  33. END
  34. CALL WriteMsg(Body,'Who Are You ?','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  35. RETURN
  36. END
  37. IF STRIP(MM.PassWord) ~=UPPER(MM.Nodo.AreaFixPw) THEN;DO
  38. DO n=0 FOR MM.BadPass.Count
  39. CALL AddLine(Body,Trasforma(MM.BadPass.n))
  40. END
  41. CALL WriteMsg(Body,'Check Your Password Please','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  42. RETURN
  43. END
  44. IF INDEX(MM.Switch,'-Q') ~=0 THEN MM.Query=TRUE;IF INDEX(MM.Switch,'-L') ~=0 THEN MM.List=TRUE
  45. IF INDEX(MM.Switch,'-U') ~=0 THEN MM.UnLinked=TRUE;IF INDEX(MM.Switch,'-H') ~=0 THEN MM.Help=TRUE
  46. IF MM.Mode='AREAFIX' THEN;DO
  47. IF INDEX(MM.Switch,'-R') ~=0 THEN MM.Rescan=TRUE;IF INDEX(MM.Switch,'-FR') ~=0 THEN MM.ForceRescan=TRUE
  48. END
  49. CALL ParseMsg(MM.FromNode)
  50. IF MM.NoPolicy.Count>1 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  51. IF MM.Help=TRUE THEN;DO
  52. DO n=0 FOR MM.Help.count;CALL AddLine(Body,Trasforma(MM.Help.n));END;CALL WriteMsg(Body,'Your Requested Help','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  53. END
  54. IF MM.Query=TRUE THEN;DO
  55. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Connected_Areas,'Your Requested Query','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  56. END
  57. IF MM.List=TRUE THEN;DO
  58. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Available_Areas,'Your Requested List','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  59. END
  60. IF MM.UnLinked=TRUE THEN;DO
  61. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Unlinked_Areas,'Your Requested Unlinked List','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  62. END
  63. RETURN
  64. ParseMsg:PROCEDURE EXPOSE MM.
  65. PARSE ARG Node
  66. DO i=0 FOR MM.Msg.Text.Count
  67. IF MM.Msg.Text.i='' THEN ITERATE
  68. IF LEFT(MM.Msg.Text.i,1)='+'|LEFT(MM.Msg.Text.i,1)='-' THEN Area=COMPRESS(MM.Msg.Text.i)
  69. ELSE PARSE UPPER VAR MM.Msg.Text.i Area Altro
  70. IF LEFT(Area,3)='---' THEN LEAVE
  71. IF LEFT(Area,1)='%' THEN;DO
  72. Linea=Area Altro
  73. IF LEFT(Area,4)='%SET' THEN MM_AddToStem MM.ExteSet 'Linea'
  74. ELSE IF Area='%RESCAN'|Area='%R'|Area='%FORCERESCAN'|Area='%FR'|Area='%RESCANDAYS'|Area='%RD'|Area='%FORCERESCANDAYS'|Area='%FRD' THEN MM_AddToStem MM.ExteResc 'Linea'
  75. ELSE MM_AddToStem MM.Extended 'Linea'
  76. ITERATE
  77. END
  78. IF LEFT(Area,1)='-' THEN;DO
  79. PARSE VAR Area 2 Area
  80. CALL PrintAree(Body,Area,Message(DisConnectArea(Area,Node)))
  81. END
  82. ELSE;DO
  83. IF LEFT(Area,1)='+' THEN;DO
  84. PARSE VAR Area 2 Area
  85. END
  86. CALL PrintAree(Body,Area,Message(ConnectArea(Area,Node)))
  87. END
  88. END
  89. IF MM.Body.Count>1 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  90. IF MM.Extended.Count>0 THEN;DO
  91. MM.PAStatus=FALSE
  92. DO h=0 FOR MM.Extended.Count;CALL Extended(Node,MM.Extended.h);END
  93. END
  94. IF MM.ExteResc.Count>0 THEN;DO
  95. MM.PAStatus=FALSE
  96. CALL AddLine(Body,AddReplyKludge(Body));DO h=0 FOR MM.ExteResc.Count;CALL ExtRescan(Node,MM.ExteResc.h);END;IF MM.Body.Count>1 THEN CALL WriteMsg(Body,'AreaFix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  97. END
  98. IF MM.ExteSet.Count>0 THEN;DO
  99. MM.PAStatus=FALSE
  100. CALL AddLine(Body,AddReplyKludge(Body))
  101. DO h=0 FOR MM.ExteSet.Count
  102. CALL ExteSet(Node,MM.ExteSet.h)
  103. END
  104. CALL WriteInfo()
  105. IF MM.Body.Count>1 THEN;DO
  106. MM.Process=TRUE
  107. CALL WriteMsg(Body,'AreaFix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  108. END
  109. END
  110. RETURN
  111. Extended:PROCEDURE EXPOSE MM.
  112. PARSE ARG Node,Keyword Line .
  113. CALL AddLine(Body,AddReplyKludge(Body))
  114. SELECT
  115. WHEN Keyword='%+ALL' THEN;DO
  116. CALL ConnectAll(Node);Subj='Connecting All Available Areas'
  117. END
  118. WHEN Keyword='%-ALL' THEN;DO
  119. CALL DisconnectAll(Node);Subj='Disconnecting All Areas'
  120. END
  121. WHEN Keyword='%INACTIVE' THEN;DO
  122. CALL Inactive(Node);Subj='Inactive All Areas'
  123. END
  124. WHEN Keyword='%ACTIVE' THEN;DO
  125. IF Activate(Node)=FALSE THEN CALL WriteMsg(Body,'You Haven`t a Inactive Areas','',MM.Address,MM.FromName,MM.FromNode,'PVT');Subj='Activate All Areas'
  126. END
  127. WHEN Keyword='%INFO'|keyword='%I' THEN CALL WriteInfo()
  128. WHEN Keyword='%TOTALAREAS'|Keyword='%T' THEN;DO
  129. CALL WriteTotalAreas();CALL WriteMsg(TOT_Areas,'Total Areas of All Networks','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  130. END
  131. WHEN Keyword='%AVAIL'|keyword='%A' THEN;DO
  132. PARSE VAR MM.FromNode xNode '@' Domain
  133. IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  134. MM.xStatus=FALSE
  135. DO k=0 FOR MM.BossNode.Count
  136. PARSE VAR MM.BossNode.k BossNodo '@' BossDomain BossLista .
  137. IF UPPER(BossDomain)=UPPER(Domain) THEN;DO
  138. MM_ReadStem BossLista Lst
  139. IF Rc ~=0 THEN;DO
  140. CALL WriteLog("*** Error: Couldn't Open" BossLista)
  141. RETURN
  142. END
  143. CALL PrintBan(Body,Message(AVAILABLE_UPLINK))
  144. DO i=0 FOR Lst.Count;CALL AddLine(Body,'    'Lst.i);END
  145. MM.xStatus=TRUE
  146. ITERATE
  147. END
  148. END
  149. IF MM.xStatus=FALSE THEN;DO
  150. CALL PrintBan(Body,Message(NO_AVAILABLE_UPLINK))
  151. END
  152. Subj='Your Requested AVAIL'
  153. END
  154. WHEN Keyword='%HELP'|keyword='%H' THEN;DO
  155. MM.Help=FALSE;IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  156. DO n=0 FOR MM.Help.count;CALL AddLine(Body,Trasforma(MM.Help.n));END;Subj='Your Requested Help'
  157. END
  158. WHEN Keyword='%POLICY'|Keyword='%P' THEN;DO
  159. CALL WritePolicy(Line);Subj='Policy of 'Line
  160. END
  161. WHEN Keyword='%RESCANALL'|keyword='%RA'|Keyword='%FORCERESCANALL'|Keyword='%FRA' THEN;DO
  162. IF MM.Mode='AREAFIX' THEN;DO
  163. IF Keyword='%FORCERESCANALL'|Keyword='%FRA' THEN MM.ForceRescan=TRUE
  164. MM_GetNodeInfo Node Info
  165. DO i=0 FOR Info.GroupCount
  166. MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  167. DO n=0 FOR Aree.Count
  168. IF GetAreaType(Aree.n.Area)='MAIL' THEN ITERATE
  169. IF IsConnected(Aree.n.Area,Node)=TRUE THEN;DO
  170. CALL PrintAree(Body,Aree.n.Area,Message(Rescan(Node,Aree.n.Area)))
  171. END
  172. END
  173. END
  174. Subj='Areafix Report'
  175. END
  176. END
  177. WHEN Keyword='%QUERY'|Keyword='%Q' THEN;DO
  178. MM.Query=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Connected_Areas,'Your Requested Query','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  179. END
  180. WHEN Keyword='%LIST'|Keyword='%L' THEN;DO
  181. MM.List=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Available_Areas,'Your Requested List','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  182. END
  183. WHEN Keyword='%UNLINKED'|Keyword='%U' THEN;DO
  184. MM.UnLinked=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Unlinked_Areas,'Your Requested Unlinked List','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  185. END
  186. OTHERWISE;DO
  187. CALL AddLine(Body,'');CALL AddLine(Body,'Command' Keyword 'not supported')
  188. CALL AddLine(Body,'');CALL AddLine(Body,'Please Use %HELP Command ....')
  189. CALL AddLine(Body,'');CALL AddLine(Body,'         MM_AreaFixPlus')
  190. CALL AddLine(Body,'');Subj='Sorry. Command not supported...'
  191. END
  192. END
  193. IF MM.Body.Count>1 THEN CALL WriteMsg(Body,Subj,'',MM.Address,MM.FromName,MM.FromNode,'PVT')
  194. RETURN
  195. ExteSet:PROCEDURE EXPOSE MM.
  196. PARSE ARG Node,Keyword Line .
  197. SELECT
  198. WHEN Keyword='%SETPKTPW' THEN;DO
  199. MM_SetNodeInfo Node PKTPW Line
  200. END
  201. WHEN Keyword='%SETAREAFIXPW' THEN;DO
  202. MM_SetNodeInfo Node AREAFIXPW Line
  203. END
  204. WHEN Keyword='%SETTICKPW' THEN;DO
  205. MM_SetNodeInfo Node TICKPW Line
  206. END
  207. WHEN Keyword='%SETARCHIVER' THEN;DO
  208. IF INDEX(MM.Archiver,Line) ~=0 THEN MM_SetNodeInfo Node ARCHIVER Line
  209. END
  210. WHEN Keyword='%SETADDRDIM' THEN;DO
  211. IF INDEX(MM.AddrDim,Line) ~=0 THEN MM_SetNodeInfo Node ADDRDIM Line
  212. END
  213. WHEN Keyword='%SETPACKDIM' THEN;DO
  214. IF INDEX(MM.PackDim,Line) ~=0 THEN MM_SetNodeInfo Node PACKDIM Line
  215. END
  216. OTHERWISE NOP
  217. END
  218. RETURN
  219. ExtRescan:PROCEDURE EXPOSE MM.
  220. PARSE ARG Node,Keyword Line
  221. SELECT
  222. WHEN Keyword='%RESCAN'|keyword='%R'|Keyword='%FORCERESCAN'|Keyword='%FR' THEN;DO
  223. IF MM.Mode='AREAFIX' THEN;DO
  224. IF Keyword='%FORCERESCAN'|Keyword='%FR' THEN MM.ForceRescan=TRUE
  225. CALL PrintAree(Body,Line,Message(Rescan(Node,Line)))
  226. END
  227. END
  228. WHEN Keyword='%RESCANDAYS'|keyword='%RD'|Keyword='%FORCERESCANDAYS'|Keyword='%FRD' THEN;DO
  229. IF MM.Mode='AREAFIX' THEN;DO
  230. IF Keyword='%FORCERESCANDAYS'|Keyword='%FRD' THEN MM.ForceRescan=TRUE
  231. MM.Days=WORD(Line,2)
  232. Line=WORD(Line,1)
  233. IF MM.Days='' THEN MM.Days=0
  234. CALL PrintAree(Body,Line,Message(Rescan(Node,Line)))
  235. END
  236. END
  237. OTHERWISE NOP
  238. END
  239. RETURN
  240. WriteInfo:
  241. Subj='Your Requested Info'
  242. MM_GetNodeInfo MM.FromNode MM.NInfo
  243. IF Rc=0 THEN;DO
  244. IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  245. PARSE VAR MM.FromNode Nodo '@' .
  246. MM.NInfo.SysPW=SUBWORD(FindNode(Nodo,'PASSWORD'),2)
  247. IF MM.NInfo.sysPW='' THEN MM.NInfo.SysPW='- No Password Set -'
  248. IF MM.NInfo.AddrDim='4' THEN MM.NInfo.AddrDim='Fido 4D'
  249. IF MM.NInfo.AddrDim='5' THEN MM.NInfo.AddrDim='Fido 5D'
  250. IF MM.NInfo.PackDim='3' THEN MM.NInfo.PackDim='Fido 2.0'
  251. IF MM.NInfo.PackDim='4' THEN MM.NInfo.PackDim='Fido 2+'
  252. IF MM.NInfo.packdim='5' THEN MM.NInfo.PackDim='Fido 2.2'
  253. IF LENGTH(MM.NInfo.PktPW)<2 THEN MM.NInfo.PKTPW='- No Password Set -'
  254. IF LENGTH(MM.NInfo.AreaFixPW)<2 THEN MM.NInfo.AreafixPW='- No Password Set -'
  255. IF LENGTH(MM.NInfo.TickPW)<2 THEN MM.NInfo.TickPW='- No Password Set -'
  256. DO n=0 FOR MM.NodeInfo.count
  257. IF INDEX(MM.NodeInfo.n,'%LISTGROUPS') ~=0 THEN;DO
  258. CALL WriteGroups();ITERATE
  259. END
  260. IF INDEX(MM.NodeInfo.n,'%LISTECHOS') ~=0 THEN;DO
  261. CALL WriteEchos(ECHO);ITERATE
  262. END
  263. IF INDEX(MM.NodeInfo.n,'%LISTTICKS') ~=0 THEN;DO
  264. CALL WriteEchos(TICK);ITERATE
  265. END
  266. IF INDEX(MM.NodeInfo.n,'%LISTARCHIVERS') ~=0 THEN;DO
  267. CALL WriteAPD(ARCH);ITERATE
  268. END
  269. IF INDEX(MM.NodeInfo.n,'%LISTPACKDIM') ~=0 THEN;DO
  270. CALL WriteAPD(PACK);ITERATE
  271. END
  272. IF INDEX(MM.NodeInfo.n,'%LISTADDRDIM') ~=0 THEN;DO
  273. CALL WriteAPD(ADDR);ITERATE
  274. END
  275. CALL AddLine(Body,Trasforma(MM.NodeInfo.n))
  276. END
  277. END
  278. ELSE CALL AddLine(Body,'- Node Not Found -')
  279. RETURN
  280. ConnectAll:PROCEDURE EXPOSE MM.
  281. PARSE ARG Node
  282. MM_GetNodeInfo Node Info
  283. IF Rc ~=0 THEN RETURN
  284. CALL WriteLog('Connect All avaiable areas to Node:' Node)
  285. TotNumAreas=0
  286. DO i=0 FOR Info.GroupCount
  287. NumAreas=0
  288. MM.Status=FALSE
  289. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  290. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  291. DO n=0 FOR Aree.Count
  292. IF GetAreaType(Aree.n.AREA)='MAIL' THEN ITERATE
  293. IF IsConnected(Aree.n.AREA,Node)=FALSE THEN;DO
  294. CALL PrintHeadAree(Aree.n.AREA,Info.GroupName.i,Message(ConnectArea(Aree.n.AREA,Node)))
  295. NumAreas=NumAreas+1
  296. TotNumAreas=TotNumAreas+1
  297. END
  298. END
  299. IF MM.Status=TRUE THEN;DO
  300. CALL PrintTail(NumAreas)
  301. CALL AddLine(Body,'')
  302. END
  303. END
  304. IF TotNumAreas=0 THEN;DO
  305. CALL PrintBan(Body,Message(ALL_CONNECTED))
  306. END
  307. RETURN
  308. DisconnectAll:PROCEDURE EXPOSE MM.
  309. PARSE ARG Node
  310. MM_GetNodeInfo Node Info
  311. IF Rc ~=0 THEN RETURN
  312. CALL WriteLog('Disconnecting all areas to node:' Node)
  313. TotNumAreas=0
  314. DO i=0 FOR Info.GroupCount
  315. NumAreas=0
  316. MM.Status=FALSE
  317. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  318. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  319. DO n=0 FOR Aree.Count
  320. IF IsConnected(Aree.n.AREA,Node)=TRUE THEN;DO
  321. CALL PrintHeadAree(Aree.n.AREA,Info.GroupName.i,Message(DisconnectArea(Aree.n.AREA,Node)))
  322. NumAreas=NumAreas+1
  323. TotNumAreas=TotNumAreas+1
  324. END
  325. END
  326. IF MM.Status=TRUE THEN;DO
  327. CALL PrintTail(NumAreas)
  328. CALL AddLine(Body,'')
  329. END
  330. END
  331. IF TotNumAreas=0 THEN;DO
  332. CALL PrintBan(Body,Message(NO_AREAS_CONNECTED))
  333. END
  334. RETURN
  335. ListAreas:PROCEDURE EXPOSE MM.
  336. PARSE ARG Node
  337. CALL WriteLog('Creating Areas Lists for Node: ' Node)
  338. MM_GetNodeInfo Node Info
  339. IF Rc=0 THEN;DO
  340. MM.HCTotal=0;MM.HATotal=0
  341. MM.HUTotal=0;MM.HCTotale=0
  342. MM.HATotale=0;MM.HUTotale=0
  343. MM.HALink=0;MM.HALinks=0
  344. MM.ListStatus=TRUE
  345. MM.Connected_Areas.Count=0
  346. MM.Available_Areas.Count=0
  347. MM.Unlinked_Areas.Count=0
  348. CALL AddLine(Connected_Areas,AddReplyKludge(Connected_Areas))
  349. CALL AddLine(Available_Areas,AddReplyKludge(Available_Areas))
  350. CALL AddLine(Unlinked_Areas,AddReplyKludge(Unlinked_Areas))
  351. IF MM.Banner ~='' THEN;DO
  352. MM_ReadStem MM.Banner MM.Connected_Areas APPEND
  353. MM_ReadStem MM.Banner MM.Available_Areas APPEND
  354. MM_ReadStem MM.Banner MM.Unlinked_Areas APPEND
  355. END
  356. CALL PrintBan(Connected_Areas,Message(LINKED_LIST))
  357. CALL PrintBan(Available_Areas,Message(AVAILABLE_LIST))
  358. CALL PrintBan(Unlinked_Areas,Message(UNLINKED_LIST))
  359. DO i=0 FOR Info.GroupCount
  360. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  361. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  362. CALL WriteFooter()
  363. MM.GAree.Count=0
  364. Gruppo=Info.GroupName.i
  365. DO y=0 FOR Aree.Count
  366. MM.GAree.y=Aree.y.AREA
  367. END
  368. MM.GAree.Count=Aree.Count
  369. MM_SortStem MM.GAree
  370. DO n=0 FOR MM.GAree.Count
  371. AreaName=MM.GAree.n
  372. Tab='   '
  373. IF GetAreaType(AreaName)='MAIL' THEN ITERATE
  374. IF MM.Mode='AREAFIX' THEN;DO
  375. MM_GetAreaInfo AreaName Info
  376. IF LENGTH(Info.Desc)<2 THEN Info.Desc=Info.Name
  377. END
  378. ELSE;DO
  379. MM_GetTickAreaInfo AreaName Info
  380. IF LENGTH(Info.Desc)<2 THEN Info.Desc=Message(DESCRIPTION_NOT_AVAILABLE)
  381. END
  382. Info.Desc=LEFT(Info.Desc,36)
  383. IsC=IsConnected(AreaName,Node)
  384. CkL=CheckLevel(Node,AreaName)
  385. IF IsC=TRUE THEN;DO
  386. MM.HCTotal=MM.HCTotal+1
  387. IF MM.HCStatus=FALSE THEN CALL HeadAreas(Connected_Areas,Gruppo,CONNECTED)
  388. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  389. MM_AddToStem MM.Connected_Areas 'Testo'
  390. END
  391. IF IsC=TRUE THEN;DO
  392. Tab='  *'
  393. MM.HALink=MM.HALink+1
  394. END
  395. MM.HATotal=MM.HATotal+1
  396. IF MM.HAStatus=FALSE THEN CALL HeadAreas(Available_Areas,Gruppo,AVAILABLE)
  397. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  398. MM_AddToStem MM.Available_Areas 'Testo'
  399. IF IsC=FALSE THEN;DO
  400. MM.HUTotal=MM.HUTotal+1
  401. IF MM.HUStatus=FALSE THEN CALL HeadAreas(Unlinked_Areas,Gruppo,UNLINKED)
  402. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  403. MM_AddToStem MM.Unlinked_Areas 'Testo'
  404. END
  405. END
  406. END
  407. CALL WriteFooter()
  408. CALL AddLine(Connected_Areas,'')
  409. CALL AddLine(Connected_Areas,'    Total Connected: 'PadR(2,MM.HCTotale,4)' Area(s)')
  410. CALL AddLine(Connected_Areas,'')
  411. CALL AddLine(Connected_Areas,'    'Message(END_LISTS))
  412. CALL AddLine(Available_Areas,'')
  413. CALL AddLine(Available_Areas,'    Total Available: 'PadR(2,MM.HATotale,4)' Area(s)')
  414. CALL AddLine(Available_Areas,'    Total Connected: 'PadR(2,MM.HALinks,4)' Area(s)')
  415. CALL AddLine(Available_Areas,'')
  416. CALL AddLine(Available_Areas,'  'Message(MEANS_LINKED))
  417. CALL AddLine(Available_Areas,'')
  418. CALL AddLine(Available_Areas,'    'Message(END_LISTS))
  419. CALL AddLine(Unlinked_Areas,'')
  420. CALL AddLine(Unlinked_Areas,'    Total UnLinked: 'PadR(2,MM.HUTotale,4)' Area(s)')
  421. CALL AddLine(Unlinked_Areas,'')
  422. CALL AddLine(Unlinked_Areas,'    'Message(END_LISTS))
  423. END
  424. RETURN
  425. WriteFooter:PROCEDURE EXPOSE MM.
  426. MM.HCStatus=FALSE;MM.HAStatus=FALSE;MM.HUStatus=FALSE
  427. IF MM.HCTotal>0 THEN;DO
  428. CALL AddLine(Connected_Areas,'  'COPIES('~',76))
  429. CALL AddLine(Connected_Areas,'    Available: 'MM.HCTotal' Area(s)')
  430. CALL AddLine(Connected_Areas,'')
  431. MM.HCTotale=MM.HCTotale+MM.HCTotal;MM.HCTotal=0
  432. END
  433. IF MM.HATotal>0 THEN;DO
  434. CALL AddLine(Available_Areas,'  'COPIES('~',76))
  435. CALL AddLine(Available_Areas,'    Available: 'PadR(2,MM.HATotal,4)' Area(s)')
  436. CALL AddLine(Available_Areas,'    Connected: 'PadR(2,MM.HALink,4)' Area(s)')
  437. CALL AddLine(Available_Areas,'')
  438. MM.HATotale=MM.HATotale+MM.HATotal;MM.HALinks=MM.HALinks+MM.HALink
  439. MM.HATotal=0;MM.HALink=0
  440. END
  441. IF MM.HUTotal>0 THEN;DO
  442. CALL AddLine(Unlinked_Areas,'  'COPIES('~',76))
  443. CALL AddLine(Unlinked_Areas,'    Available: 'MM.HUTotal' Area(s)')
  444. CALL AddLine(Unlinked_Areas,'')
  445. MM.HUTotale=MM.HUTotale+MM.HUTotal;MM.HUTotal=0
  446. END
  447. RETURN
  448. HeadAreas:PROCEDURE EXPOSE MM.
  449. PARSE ARG Stem,Gruppo,Lista
  450. CALL AddLine(Stem,'')
  451. CALL AddLine(Stem,'    GROUP : 'Gruppo)
  452. CALL AddLine(Stem,'    ~~~~~~~~'COPIES('~',LENGTH(Gruppo)))
  453. CALL AddLine(Stem,'')
  454. CALL AddLine(Stem,'    Area:                           Description:                       Status:')
  455. CALL AddLine(Stem,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  456. IF Lista='CONNECTED' THEN MM.HCStatus=TRUE
  457. IF Lista='AVAILABLE' THEN MM.HAStatus=TRUE
  458. IF Lista='UNLINKED' THEN MM.HUStatus=TRUE
  459. RETURN
  460. Inactive:PROCEDURE EXPOSE MM.
  461. PARSE ARG Node
  462. CALL WriteLog('Inactive all areas to node' node)
  463. PARSE VAR Node Zone ':' Net '/' Nodo '.' Point '@' Domain
  464. PassiFile=MM.PathCfg'INACTIVE/'Zone'.'Net'.'Nodo'.'Point'.'Domain'.'MM.Mode
  465. Action=''
  466. IF EXISTS(PassiFile) THEN Action='APPEND'
  467. MM.InactiveAll.Count=0
  468. MM_GetNodeInfo Node Info
  469. IF Rc=0 THEN;DO
  470. CALL PrintBan(Body,Message(INACTIVE_ALL))
  471. DO i=0 FOR Info.GroupCount
  472. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  473. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  474. DO n=0 FOR Aree.Count
  475. IF IsConnected(Aree.n.AREA,Node)=TRUE THEN;DO
  476. CALL PrintAree(Body,Aree.n.Area,Message(DisConnectArea(Aree.n.Area,Node)))
  477. Testo=STRIP(Aree.n.AREA)
  478. MM_AddToStem MM.InactiveAll 'Testo'
  479. END
  480. END
  481. END
  482. MM_WriteStem PassiFile MM.InactiveAll Action
  483. CALL CLOSE('out')
  484. END
  485. MM.PAStatus=FALSE;CALL PrintBan(Body,Message(INACTIVE_MESS))
  486. RETURN
  487. Activate:PROCEDURE EXPOSE MM.
  488. PARSE ARG Node
  489. CALL WriteLog('Activate all areas to node:' node)
  490. PARSE VAR Node Zone ':' Net '/' Nodo '.' Point '@' Domain
  491. PassiFile=MM.PathCfg'INACTIVE/'Zone'.'Net'.'Nodo'.'Point'.'Domain'.'MM.Mode
  492. IF ~EXISTS(PassiFile) THEN;DO
  493. DO n=0 FOR MM.NotPass.Count
  494. CALL AddLine(Body,Trasforma(MM.NotPass.n))
  495. END
  496. RETURN FALSE
  497. END
  498. CALL PrintBan(Body,Message(ACTIVE_ALL))
  499. MM_ReadStem PassiFile InacAree
  500. DO j=0 FOR InacAree.Count
  501. CALL PrintAree(Body,InacAree.j,Message(ConnectArea(InacAree.j,Node)))
  502. END
  503. MM.PAStatus=FALSE;MM_DeleteFile PassiFile
  504. RETURN TRUE
  505. Rescan:PROCEDURE EXPOSE MM.
  506. PARSE ARG Node,Area
  507. Res=IsInGroup(Area,Node)
  508. SELECT
  509. WHEN Res=10 THEN;DO
  510. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: AREA NOT ECHO')
  511. RETURN 'AREA_NOT_ECHO'
  512. END
  513. WHEN Res=5 THEN;DO
  514. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: UNKNOWN AREA')
  515. RETURN 'AREA_UNKNOWN'
  516. END
  517. WHEN Res=0 THEN;DO
  518. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: AREA NOT AVAILABLE')
  519. RETURN 'AREA_NOT_AVAILABLE'
  520. END
  521. OTHERWISE NOP
  522. END
  523. IF MM.Mode='AREAFIX' THEN;DO
  524. MM_GetAreaInfo Area Info
  525. IF Info.MBase='PTHRO' THEN;DO
  526. RETURN 'NO_RESCAN_PTHRO'
  527. END
  528. END
  529. IF MM.ForceRescan=TRUE THEN MM_Rescan Area Node MM.Days FORCED
  530. ELSE MM_Rescan Area Node MM.Days
  531. RETURN 'AREA_RESCANNED'
  532. ConnectArea:PROCEDURE EXPOSE MM.
  533. PARSE ARG Area,Node
  534. Res=IsInGroup(Area,Node)
  535. Link=''
  536. Scan=''
  537. SELECT
  538. WHEN Res=10 THEN;DO
  539. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA NOT ECHO')
  540. RETURN 'AREA_NOT_ECHO'
  541. END
  542. WHEN Res=5 THEN;DO
  543. IF MM.Mode='AREAFIX' THEN;DO
  544. DO w=0 FOR MM.SpecialNode.Count
  545. PARSE VAR MM.SpecialNode.w Nodo '@' Dom Path Addr MsgBase GroupName GroupLevel
  546. PARSE VAR Node SNode '@' Domain
  547. IF Nodo=SNode THEN;DO
  548. SELECT
  549. WHEN UPPER(MsgBase)='INDEXED' THEN MsgBase='IDX'
  550. WHEN UPPER(MsgBase)='COMPRESSED' THEN MsgBase='COMP'
  551. WHEN UPPER(MsgBase)='PASSTHROUGH' THEN MsgBase='PTHRO'
  552. OTHERWISE NOP
  553. END
  554. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: UNKNOWN AREA (Found a Special Node)')
  555. DO k=0 FOR MM.BossNode.Count
  556. PARSE VAR MM.BossNode.k BossNodo '@' BossDomain BossLista BossPw
  557. BossPw=STRIP(BossPw)
  558. BossLista=STRIP(BossLista)
  559. IF UPPER(BossDomain)=UPPER(Domain) THEN;DO
  560. MM_ReadStem BossLista Lst
  561. IF Rc ~=0 THEN;DO
  562. CALL WriteLog("*** Error: Couldn't open" BossLista)
  563. ITERATE
  564. END
  565. MM_SearchInStem Lst LstResp Area'#?' STR
  566. IF LstResp.Count>0 THEN;DO
  567. NodoArea=BossNodo'@'BossDomain MM.Mail Node Addr SUBWORD(LstResp.0,1,1) BossPw
  568. MM_AddToStem MM.Export 'NodoArea'
  569. CALL WriteLog(' --> OK! Found Area in list  -  Send Message to UpLink ')
  570. MM_CreateArea Area Path Addr MsgBase GroupName GroupLevel BossNodo
  571. MM_AddAreaNode Area Node
  572. MM.Process=TRUE
  573. RETURN 'AREA_REQUESTED_TO_BOSS'
  574. END
  575. CALL WriteLog(' --> Area Not Found in "'BossLista'"')
  576. END
  577. END
  578. RETURN 'AREA_UNKNOWN'
  579. END
  580. END
  581. END
  582. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: UNKNOWN AREA')
  583. RETURN 'AREA_UNKNOWN'
  584. END
  585. WHEN Res=0 THEN;DO
  586. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA NOT AVAILABLE')
  587. RETURN 'AREA_NOT_AVAILABLE'
  588. END
  589. OTHERWISE NOP
  590. END
  591. IF MM.Mode='AREAFIX' THEN;DO
  592. IF CheckLevel(Node,Area)='R' THEN MM_AddAreaNode Area Node 'READONLY'
  593. ELSE MM_AddAreaNode Area Node
  594. END
  595. ELSE;DO
  596. IF CheckLevel(Node,Area)='R' THEN MM_AddTickAreaNode Area Node 'READONLY'
  597. ELSE MM_AddTickAreaNode Area Node
  598. END
  599. SELECT
  600. WHEN Rc=0 THEN;DO
  601. MM.Process=TRUE
  602. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA LINKED')
  603. Link='_LINKED'
  604. IF MM.AutoPolicy=TRUE THEN;DO
  605. CALL WritePolicy(Area)
  606. END
  607. END
  608. WHEN Rc=1 THEN;DO
  609. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA ALREADY LINKED')
  610. Link='_YET_LINKED'
  611. END
  612. OTHERWISE NOP
  613. END
  614. IF MM.Mode='AREAFIX' THEN;DO
  615. MM_GetAreaInfo Area Info
  616. IF Info.MBase='PTHRO' THEN;DO
  617. RETURN 'AREA'Link||'_NORESCANNED'
  618. END
  619. SELECT
  620. WHEN MM.Rescan=TRUE THEN;DO
  621. MM_Rescan Area Node MM.Days
  622. Scan='_RESCANNED'
  623. END
  624. WHEN MM.ForceRescan=TRUE THEN;DO
  625. MM_Rescan Area Node MM.Days FORCED
  626. Scan='_RESCANNED'
  627. END
  628. OTHERWISE NOP
  629. END
  630. END
  631. RETURN 'AREA'Link||Scan
  632. DisconnectArea:PROCEDURE EXPOSE MM.
  633. PARSE ARG Area,Node
  634. Res=IsInGroup(Area,Node)
  635. SELECT
  636. WHEN Res=10 THEN;DO
  637. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA NOT ECHO')
  638. RETURN 'AREA_NOT_ECHO'
  639. END
  640. WHEN Res=5 THEN;DO
  641. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: UNKNOWN AREA')
  642. RETURN 'AREA_UNKNOWN'
  643. END
  644. WHEN Res=0 THEN;DO
  645. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA NOT AVAILABLE')
  646. RETURN 'AREA_NOT_AVAILABLE'
  647. END
  648. OTHERWISE
  649. END
  650. IF MM.Mode='AREAFIX' THEN MM_DelAreaNode Area Node
  651. ELSE MM_DelTickAreaNode Area Node
  652. SELECT
  653. WHEN Rc=0 THEN;DO
  654. MM.Process=TRUE
  655. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA UNLINKED')
  656. RETURN 'AREA_UNLINKED'
  657. END
  658. WHEN Rc=1 THEN;DO
  659. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA ALREADY UNLINKED')
  660. RETURN 'AREA_YET_UNLINKED'
  661. END
  662. END
  663. RETURN 0
  664. WriteTotalAreas:PROCEDURE EXPOSE MM.
  665. MM_GetAddrs Nodi;DO i=0 FOR Nodi.Count;PARSE UPPER VAR Nodi.i '@' Domain;IF Domain='VIRTUAL' THEN ITERATE;MM_SearchInStem xDomain Resp Domain STR;IF Resp.Count=0 THEN;DO;MM_AddToStem xDomain 'Domain';INTERPRET 'MM.'Domain".Count = 0";END;END
  666. MM_GetAreas yAree ECHO;DO i=0 FOR yAree.Count;MM_GetAreaInfo yAree.i yInfo;PARSE UPPER VAR yInfo.Addr '@' yDomain;IF yInfo.Desc='' THEN yInfo.Desc='Description Not Available';CALL AddLine(yDomain,' 'PadR(2,yAree.i,35)'  'yInfo.Desc);END
  667. MM.TOT_Areas.Count=0;DO i=0 FOR xDomain.Count;INTERPRET "Cont = MM."xDomain.i".Count";MM_SortStem 'MM.'xDomain.i;CALL AddLine(TOT_Areas,'');CALL AddLine(TOT_Areas,'Network: ' xDomain.i);CALL AddLine(TOT_Areas,'');CALL AddLine(TOT_Areas,'    Area:                               Description:');CALL AddLine(TOT_Areas,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');DO u=0 FOR Cont;MM_AddToStem MM.TOT_Areas 'MM.'xDomain.i'.'u;END;CALL AddLine(TOT_Areas,'');CALL AddLine(TOT_Areas,'');END;RETURN
  668. CheckLevel:PROCEDURE EXPOSE MM.
  669. PARSE ARG Node,Area
  670. Flags=''
  671. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info
  672. ELSE MM_GetTickAreaInfo Area Info
  673. MM_GetNodeInfo Node NodeInfo
  674. DO i=0 FOR NodeInfo.GroupCount
  675. IF (NodeInfo.GroupName.i=Info.Group)&(Info.Level<NodeInfo.GroupLevel.i) THEN;DO
  676. Flags='R/W'
  677. LEAVE
  678. END
  679. END
  680. IF INDEX(Flags,'R/W')=0 THEN Flags='R'
  681. IF MM.AvailPolicy=TRUE THEN;DO
  682. IF EXISTS(MM.PolicyPath||MM.Mode'/'Area) THEN Flags=Flags||'/P'
  683. END
  684. RETURN Flags
  685. PrintHeadAree:PROCEDURE EXPOSE MM.
  686. PARSE ARG AreaName,Group,Altro
  687. IF MM.Status=FALSE THEN;DO
  688. CALL AddLine(Body,'')
  689. CALL AddLine(Body,'   GROUP: 'Group)
  690. CALL AddLine(Body,'   ~~~~~~~~'COPIES('~',LENGTH(Group)))
  691. CALL AddLine(Body,'')
  692. CALL AddLine(Body,'  Area:                                 Status:')
  693. CALL AddLine(Body,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  694. MM.Status=TRUE
  695. END
  696. CALL AddLine(Body,' 'PadR(2,AreaName,35)'  'Altro)
  697. RETURN
  698. PrintAree:PROCEDURE EXPOSE MM.
  699. PARSE ARG Stem,AreaName,Altro
  700. IF MM.PAStatus=FALSE THEN;DO
  701. CALL AddLine(Stem,'')
  702. CALL AddLine(Stem,'  Area:                                 Status:')
  703. CALL AddLine(Stem,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  704. MM.PAStatus=TRUE
  705. END
  706. CALL AddLine(Stem,' 'PadR(2,AreaName,35)'  'Altro)
  707. RETURN
  708. Replace:PROCEDURE
  709. PARSE ARG String,New,Old;DO WHILE INDEX(String,Old) ~=0;INTERPRET "PARSE VAR String l '"Old"' r";String=l||New||r;END;RETURN String
  710. Trasforma:PROCEDURE EXPOSE MM.
  711. PARSE ARG String
  712. IF INDEX(String,'%')=0 THEN RETURN String
  713. String=Replace(String,MM.FromNode,'%ORIGNODE');String=Replace(String,MM.ToNode,'%DESTNODE')
  714. String=Replace(String,MM.SysopName,'%SYSOPNAME');String=Replace(String,MM.FromName,'%NAME')
  715. String=Replace(String,MM.FromFirst,'%FIRST');String=Replace(String,MM.PassWord,'%PASSWORD')
  716. String=Replace(String,MM.Sysop,'%SYSOP');String=Replace(String,'0d'x,'%\')
  717. String=Replace(String,MM.SpecialAddr,'%SPECIALNODE');String=Replace(String,MM.Info.Name,'%TAGNAME')
  718. String=Replace(String,MM.Info.Addr,'%ADDRESS');String=Replace(String,MM.Info.Path,'%PATH')
  719. String=Replace(String,MM.Info.MBase,'%MESSAGEBASE');String=Replace(String,MM.Info.Type,'%AREATYPE')
  720. String=Replace(String,MM.Info.Group,'%GROUPNAME');String=Replace(String,MM.Info.Level,'%GROUPLEVEL')
  721. String=Replace(String,MM.NInfo.Archiver,'%ARCHIVER')
  722. String=Replace(String,MM.NInfo.AddrDim,'%ADDRDIM');String=Replace(String,MM.NInfo.PackDim,'%PACKDIM')
  723. String=Replace(String,MM.NInfo.EchoFlavor,'%ECHOFLAVOR');String=Replace(String,MM.NInfo.TickFlavor,'%TICKFLAVOR')
  724. String=Replace(String,MM.NInfo.PktPW,'%PKTPW');String=Replace(String,MM.NInfo.AreaFixPW,'%AREAFIXPW')
  725. String=Replace(String,MM.NInfo.TickPW,'%TICKPW');String=Replace(String,MM.NInfo.SysPW,'%SESSIONPW')
  726. RETURN String
  727. PrintBan:PROCEDURE EXPOSE MM.
  728. PARSE ARG Stem,Line;CALL AddLine(Stem,'');CALL AddLine(Stem,'  'Line);CALL AddLine(Stem,'  'COPIES('~',LENGTH(Line)));CALL AddLine(Stem,'');RETURN
  729. GetAreaType:PROCEDURE EXPOSE MM.
  730. PARSE ARG Area;IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info;ELSE Info.Type='TICK';RETURN Info.Type
  731. IsConnected:PROCEDURE EXPOSE MM.
  732. PARSE ARG Area,Nodo;IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info;ELSE MM_GetTickAreaInfo Area Info;IF Rc ~=0 THEN RETURN FALSE;MM_SearchInStem Info.Node Resp Nodo'#?' STR;IF Resp.Count=1 THEN RETURN TRUE;RETURN FALSE
  733. Message:PROCEDURE EXPOSE MM.
  734. PARSE ARG Chiave;DO n=0 FOR MM.Messages.Count;PARSE VAR MM.Messages.n Key Frase;IF Chiave=STRIP(Key) THEN RETURN TRASFORMA(STRIP(Frase));END;RETURN ''
  735. AddLine:PROCEDURE EXPOSE MM.
  736. PARSE ARG Stem,Line;INTERPRET "Cont = MM."Stem".Count";INTERPRET "MM."Stem".Cont = Line";INTERPRET "MM."Stem".Count = Cont +1";RETURN
  737. PadR:PROCEDURE
  738. PARSE ARG Modo,Stringa,Len;IF Len<LENGTH(Stringa) THEN RETURN Stringa;IF Modo=1 THEN RETURN Stringa COPIES(' ',Len-LENGTH(Stringa));IF Modo=2 THEN RETURN ' 'Stringa COPIES('.',Len-LENGTH(Stringa));IF Modo=3 THEN RETURN COPIES(' ',Len-LENGTH(Stringa))Stringa
  739. PrintTail:PROCEDURE EXPOSE MM.
  740. PARSE ARG NumAree;CALL AddLine(Body,'  'COPIES('~',76));CALL AddLine(Body,'    Total:' NumAree 'Areas');RETURN
  741. IsInGroup:PROCEDURE EXPOSE MM.
  742. PARSE ARG Area,Node
  743. MM.ReadOnly=FALSE
  744. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info
  745. ELSE MM_GetTickAreaInfo Area Info
  746. IF Rc ~=0 THEN RETURN 5
  747. IF MM.Mode='AREAFIX' THEN;DO
  748. IF Info.Type='MAIL' THEN RETURN 10
  749. END
  750. MM_GetNodeInfo Node NodeInfo
  751. IF Rc ~=0 THEN RETURN 0
  752. IF MM.Force=TRUE THEN RETURN 1
  753. DO i=0 FOR NodeInfo.GroupCount
  754. IF (NodeInfo.GroupName.i=Info.Group)&(Info.Level<=NodeInfo.GroupLevel.i) THEN RETURN 1
  755. END
  756. RETURN 0
  757. WriteGroups:PROCEDURE EXPOSE MM.
  758. CALL AddLine(Body,' -----------------------------------------------------------')
  759. CALL AddLine(Body,' Groups                               Levels')
  760. CALL AddLine(Body,' -----------------------------------------------------------')
  761. DO i=0 FOR MM.NInfo.GroupCount
  762. CALL AddLine(Body,' 'PadR(1,MM.NInfo.GroupName.i,35) MM.NInfo.GroupLevel.i)
  763. END
  764. CALL AddLine(Body,' -----------------------------------------------------------')
  765. RETURN
  766. WriteEchos:PROCEDURE EXPOSE MM.
  767. PARSE ARG Modo
  768. CALL AddLine(Body,' +--------------------------+-------------------------------+----------------+')
  769. CALL AddLine(Body,' | Area                     | Groups                 Levels | Address        |')
  770. CALL AddLine(Body,' +--------------------------+-------------------------------+----------------+')
  771. IF Modo='ECHO' THEN;DO
  772. MM_SortStem MM.NInfo.Area
  773. IF MM.NInfo.Area.Count>0 THEN;DO
  774. DO i=0 FOR MM.NInfo.Area.Count
  775. MM_GetAreaInfo MM.NInfo.Area.i Area
  776. PARSE VAR Area.Addr Area.Addr '@' .
  777. CALL AddLine(Body,'   'PadR(1,MM.NInfo.Area.i,25) PadR(1,Area.Group,24) PadR(1,Area.Level,3)'  'Area.Addr)
  778. END
  779. END
  780. ELSE CALL AddLine(Body,'   'PadR(1,'Nothing...',25))
  781. CALL AddLine(Body,' +--------------------------+')
  782. CALL AddLine(Body,' | Active Echo Alias        |')
  783. CALL AddLine(Body,' +--------------------------+')
  784. DO o=0 FOR MM.AliasAreaFix.Count
  785. CALL AddLine(Body,'   'PadR(1,MM.AliasAreaFix.o,25))
  786. END
  787. END
  788. ELSE;DO
  789. MM_SortStem MM.NInfo.TickArea
  790. IF MM.NInfo.TickArea.Count>0 THEN;DO
  791. DO i=0 FOR MM.NInfo.TickArea.Count
  792. MM_GetTickAreaInfo MM.NInfo.TickArea.i Area
  793. PARSE VAR Area.Addr Area.Addr '@' .
  794. CALL AddLine(Body,'   'PadR(1,MM.NInfo.TickArea.i,25) PadR(1,Area.Group,24) PadR(1,Area.Level,3)'  'Area.Addr)
  795. END
  796. END
  797. ELSE CALL AddLine(Body,'   'PadR(1,'Nothing...',25))
  798. CALL AddLine(Body,' +--------------------------+')
  799. CALL AddLine(Body,' | Active File Alias        |')
  800. CALL AddLine(Body,' +--------------------------+')
  801. DO o=0 FOR MM.AliasRaid.Count
  802. CALL AddLine(Body,'   'PadR(1,MM.AliasRaid.o,25))
  803. END
  804. END
  805. CALL AddLine(Body,' -----------------------------------------------------------------------------')
  806. RETURN
  807. WriteAPD:PROCEDURE EXPOSE MM.
  808. PARSE ARG Modo
  809. SELECT
  810. WHEN Modo='ARCH' THEN;DO
  811. MM.TempAPD=MM.Archiver
  812. DO WHILE MM.TempAPD ~=''
  813. PARSE VAR MM.TempAPD Temp ' ' MM.TempAPD
  814. CALL AddLine(Body,'   'PadR(1,Temp,25))
  815. END
  816. END
  817. WHEN Modo='PACK' THEN;DO
  818. CALL AddLine(Body,'   'PadR(1,'2.2     ( FSC-0045 )',25))
  819. CALL AddLine(Body,'   'PadR(1,'2+      ( FSC-0048 )',25))
  820. CALL AddLine(Body,'   'PadR(1,'2.0     ( FTS-0001 )',25))
  821. END
  822. WHEN Modo='ADDR' THEN;DO
  823. CALL AddLine(Body,'   'PadR(1,'5D ',25))
  824. CALL AddLine(Body,'   'PadR(1,'4D ',25))
  825. CALL AddLine(Body,'   'PadR(1,'2D ',25))
  826. END
  827. END
  828. RETURN
  829. FindAddr:PROCEDURE EXPOSE MM.
  830. PARSE ARG Nodo;MM_GetNearestAddr Nodo 'MM.Address';RETURN MM.Address
  831. ReadCfg:PROCEDURE EXPOSE MM.
  832. CALL WriteLog(MM.PrgName '- Started')
  833. IF ~SHOW('l',"rexxsupport.library") THEN;DO
  834. IF ~ADDLIB("rexxsupport.library",0,-30,0) THEN;DO
  835. SAY "Could not open rexxsupport.library"
  836. CALL Errore('10')
  837. END
  838. END
  839. IF(~SHOW('l',"traplist.library")) THEN;DO
  840. IF(~ADDLIB("traplist.library",0,-30,0)) THEN;DO
  841. SAY "Could not open traplist.library"
  842. CALL Errore('10')
  843. END
  844. END
  845. MM.PathCfg='MM:Config/';MM.PolicyPath='MM:Config/Policy/';MM.Banner=''
  846. MM.AutoPolicy=FALSE;MM.AutoExport=FALSE
  847. MM.ProcessPassTHRO=FALSE;MM.AvailPolicy=FALSE
  848. MM.Process=FALSE;MM.Export.Count=0
  849. MM.Messages.Count=0;MM.NewArea.Count=0
  850. MM.Help.Count=0;MM.NodeInfo.Count=0
  851. MM.Unknown.Count=0;MM.BadPass.Count=0
  852. MM.NotPass.Count=0;MM.BossNode.Count=0
  853. MM.SpecialNode.Count=0;MM.CheckPThro.Count=0
  854. MM.AliasAreaFix.Count=0;MM.AliasRaid.Count=0
  855. MM.Archiver='NONE';MM.AddrDim='ADDR5D ADDR4D ADDR2D';MM.PackDim='PACK5D PACK4D PACK3D'
  856. MM_ReadStem MM.PathCfg||'MM_AreaFixPlus.Cfg' Config
  857. IF Rc ~=0 THEN;DO
  858. SAY 'Could not open "'||MM.PathCfg||'MM_AreaFixPlus.Cfg"'
  859. CALL Errore('10')
  860. END
  861. DO c=0 FOR Config.Count
  862. IF (LEFT(Config.c,1) ~=';')&Config.c ~='' THEN;DO
  863. PARSE VAR Config.c Keyword Linea
  864. SELECT
  865. WHEN Keyword='#BANNER' THEN MM.Banner=STRIP(Linea)
  866. WHEN Keyword='#ARCHIVER' THEN MM.Archiver=STRIP(Linea)
  867. WHEN Keyword='#POLICYPATH' THEN MM.PolicyPath=STRIP(Linea)
  868. WHEN Keyword='#TASKPRI' THEN PRAGMA('P',Linea)
  869. WHEN Keyword='#AUTOPOLICY' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AutoPolicy=TRUE
  870. WHEN Keyword='#AVAILPOLICY' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AvailPolicy=TRUE
  871. WHEN Keyword='#AUTOEXPORT' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AutoExport=TRUE
  872. WHEN Keyword='#PROCESSPASSTHRO' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.ProcessPassTHRO=TRUE
  873. WHEN Keyword='#ALIASAREAFIX' THEN;DO
  874. Cont=MM.AliasAreaFix.Count;MM.AliasAreaFix.Cont=STRIP(Linea);MM.AliasAreaFix.Count=Cont+1
  875. END
  876. WHEN Keyword='#ALIASRAID' THEN;DO
  877. Cont=MM.AliasRaid.Count;MM.AliasRaid.Cont=STRIP(Linea);MM.AliasRaid.Count=Cont+1
  878. END
  879. WHEN Keyword='#BOSSNODE' THEN;DO
  880. Cont=MM.BossNode.Count;MM.BossNode.Cont=STRIP(Linea);MM.BossNode.Count=Cont+1
  881. END
  882. WHEN Keyword='#SPECIALNODE' THEN;DO
  883. Cont=MM.SpecialNode.Count;MM.SpecialNode.Cont=STRIP(Linea);MM.SpecialNode.Count=Cont+1
  884. END
  885. WHEN Keyword='#CHECKPASSTHRO' THEN;DO
  886. Cont=MM.CheckPThro.Count;MM.CheckPThro.Cont=STRIP(Linea);MM.CheckPThro.Count=Cont+1
  887. END
  888. WHEN Keyword='#HELP' THEN;DO
  889. Cont=MM.Help.Count;MM.Help.Cont=Linea;MM.Help.Count=Cont+1
  890. END
  891. WHEN Keyword='#NODE_UNKNOWN' THEN;DO
  892. Cont=MM.Unknown.Count;MM.Unknown.Cont=Linea;MM.Unknown.Count=Cont+1
  893. END
  894. WHEN Keyword='#BAD_PASSWORD' THEN;DO
  895. Cont=MM.BadPass.Count;MM.BadPass.Cont=Linea;MM.BadPass.Count=Cont+1
  896. END
  897. WHEN Keyword='#NOT_INACTIVE' THEN;DO
  898. Cont=MM.NotPass.Count;MM.NotPass.Cont=Linea;MM.NotPass.Count=Cont+1
  899. END
  900. WHEN Keyword='#NEW_AREA' THEN;DO
  901. Cont=MM.NewArea.Count;MM.NewArea.Cont=Linea;MM.NewArea.Count=Cont+1
  902. END
  903. WHEN Keyword='#MESSAGE' THEN;DO
  904. Cont=MM.Messages.Count;MM.Messages.Cont=Linea;MM.Messages.Count=Cont+1
  905. END
  906. WHEN Keyword='#NODE_INFO' THEN;DO
  907. Cont=MM.NodeInfo.Count;MM.NodeInfo.Cont=Linea;MM.NodeInfo.Count=Cont+1
  908. END
  909. OTHERWISE NOP
  910. END
  911. END
  912. END
  913. MM_GetAreas MM.Mails MAIL
  914. IF MM.Mails.Count>1 THEN;DO
  915. Cont=0
  916. DO b=0 FOR MM.Mails.Count
  917. MM_GetAreaInfo MM.Mails.b Info
  918. PARSE UPPER VAR Info.Addr '@' Domain
  919. IF Domain='VIRTUAL' THEN ITERATE
  920. MM.Mails.Cont=MM.Mails.b
  921. Cont=Cont+1
  922. END
  923. MM.Mails.Count=Cont
  924. END
  925. MM_GetSysop 'MM.Sysop'
  926. MM.SysopName=SUBWORD(MM.Sysop,1,1)
  927. DefAreaFix='AREAFIX';DefRaid='RAID'
  928. IF MM.AliasAreaFix.Count=0 THEN MM_AddToStem MM.AliasAreaFix 'DefAreaFix'
  929. IF MM.AliasRaid.Count=0 THEN MM_AddToStem MM.AliasRaid 'DefRaid'
  930. IF ~EXISTS(MM.PathCfg'INACTIVE') THEN CALL MAKEDIR(MM.PathCfg'INACTIVE')
  931. IF ~EXISTS(MM.PathCfg'CHECKPTHRO') THEN CALL MAKEDIR(MM.PathCfg'CHECKPTHRO')
  932. IF ~EXISTS(MM.PolicyPath'AREAFIX') THEN CALL MAKEDIR(MM.PolicyPath'AREAFIX')
  933. IF ~EXISTS(MM.PolicyPath'RAID') THEN CALL MAKEDIR(MM.PolicyPath'RAID')
  934. IF MM.NewArea.Count=0 THEN;DO
  935. CALL WriteLog('Config parse error. You need to specify the NewArea Messages')
  936. CALL Errore('10')
  937. END
  938. IF MM.NodeInfo.Count=0 THEN;DO
  939. CALL WriteLog('Config parse error. You need to specify the NodeInfo #Messages')
  940. CALL Errore('10')
  941. END
  942. IF MM.Message.Count=0 THEN;DO
  943. CALL WriteLog('Config parse error. You need to specify the #Messages')
  944. CALL Errore('10')
  945. END
  946. IF MM.Help.Count=0 THEN;DO
  947. CALL WriteLog('Config parse error. You need to specify the Help Messages')
  948. CALL Errore('10')
  949. END
  950. IF MM.Unknown.Count=0 THEN;DO
  951. CALL WriteLog('Config parse error. You need to specify the Unknown Messages')
  952. CALL Errore('10')
  953. END
  954. IF MM.BadPass.Count=0 THEN;DO
  955. CALL WriteLog('Config parse error. You need to specify the Bad Password Messages')
  956. CALL Errore('10')
  957. END
  958. IF MM.NotPass.Count=0 THEN;DO
  959. CALL WriteLog('Config parse error. You need to specify the No Passivate Messages')
  960. CALL Errore('10')
  961. END
  962. IF MM.NewArea.Count=0 THEN;DO
  963. CALL WriteLog('Config parse error. You need to specify the New Area Messages')
  964. CALL Errore('10')
  965. END
  966. RETURN
  967. Fine:PROCEDURE EXPOSE MM.
  968. IF MM.ProcessPassTHRO=TRUE THEN;DO
  969. IF MM.CheckPThro.Count>0 THEN;DO
  970. MM_GetAreas Maria ECHO
  971. DO i=0 FOR Maria.Count
  972. MM.Body.Count=0
  973. MM_GetAreaInfo Maria.i Info
  974. IF Info.Mbase ~='PTHRO' THEN ITERATE
  975. IF Info.Node.Count=1 THEN;DO
  976. Days=FALSE
  977. DO f=0 FOR MM.CheckPThro.Count
  978. IF INDEX(MM.CheckPThro.f,Info.Node.0) ~=0 THEN;DO
  979. PARSE VAR MM.CheCkPThro.f BossNodo BossPw Days
  980. Days=STRIP(Days)
  981. LEAVE
  982. END
  983. END
  984. IF Days=FALSE THEN;DO
  985. CALL WriteLog('Found the PassThrough Area:' Maria.i 'but not found his Feder - SKIPPING!')
  986. ITERATE
  987. END
  988. IF EXISTS(MM.PathCfg'CHECKPTHRO/'Maria.i) THEN;DO
  989. MM_ReadStem MM.PathCfg'CHECKPTHRO/'Maria.i Linea
  990. PARSE VAR Linea.0 Days Data
  991. IF Data= DATE('C') THEN ITERATE
  992. Days= Days-1
  993. IF Days=0 THEN;DO
  994. CALL WriteLog('Found the PassThrough Area: 'Maria.i 'and sent msg is Feder !')
  995. CALL WriteLog('*** Don`t forget to delete it from the MM Config ***')
  996. CALL AddLine(Body,'-'Maria.i)
  997. CALL AddLine(Body,'---')
  998. PARSE VALUE FindAddr(BossNodo) WITH MM.Address .
  999. MM.Mail=MM.Mails.0
  1000. CALL WriteMsg(Body,BossPw,MM.SysOp,MM.Address,'AreaFix',BossNodo,'PVT')
  1001. MM_DelAreaNode Maria.i BossNodo
  1002. MM.Process=TRUE
  1003. ADDRESS COMMAND 'C:Delete >NIL: 'Info.Path' ALL'
  1004. MM_DeleteFile MM.PathCfg'CHECKPTHRO/'Maria.i
  1005. ITERATE
  1006. END
  1007. END
  1008. OPEN('Out',MM.PathCfg'CHECKPTHRO/'Maria.i,'W')
  1009. CALL WRITELN('Out',Days DATE('C'))
  1010. CLOSE('Out')
  1011. END
  1012. END
  1013. END
  1014. END
  1015. CALL Fine2()
  1016. RETURN
  1017. Fine2:PROCEDURE EXPOSE MM.
  1018. IF MM.Process=TRUE THEN;DO
  1019. IF MM.Export.Count>0 THEN;DO
  1020. DO j=0 FOR MM.BossNode.Count
  1021. PARSE VAR MM.BossNode.j Nodo .
  1022. MM_SearchInStem MM.Export Resp Nodo'#?' STR
  1023. IF Resp.Count>0 THEN;DO
  1024. DO n=0 FOR Resp.Count
  1025. PARSE VAR Resp.n BossNodo MM.Mail MM.SpecialAddr Addr Area BossPw .
  1026. Testo=STRIP(Area)
  1027. CALL AddLine(Body,Testo)
  1028. END
  1029. CALL AddLine(Body,'---')
  1030. CALL WriteMsg(Body,BossPw,MM.SysOp,Addr,'AreaFix',BossNodo,'PVT')
  1031. DO n=0 FOR Resp.Count
  1032. PARSE VAR Resp.n BossNodo MM.Mail MM.SpecialAddr Addr Area BossPw
  1033. MM_GetAreaInfo Area MM.Info
  1034. DO g=0 FOR MM.NewArea.Count
  1035. CALL AddLine(Body,Trasforma(MM.NewArea.g))
  1036. END
  1037. CALL AddLine(Body,'')
  1038. END
  1039. CALL AddLine(Body,'---')
  1040. CALL WriteMsg(Body,'New Area Linked',MM.PrgName,Addr,MM.SysOp,Addr,'PVT SENT')
  1041. END
  1042. END
  1043. END
  1044. MM_SaveCfg
  1045. END
  1046. IF MM.AutoExport=TRUE THEN;DO
  1047. DO i=0 FOR MM.Mails.Count
  1048. MM_Export MM.Mails.i
  1049. END
  1050. END
  1051. CALL WriteLog(MM.PrgName '- Ended')
  1052. MM_CloseLog
  1053. EXIT
  1054. RETURN
  1055. Errore:PROCEDURE EXPOSE MM.
  1056. PARSE ARG Value
  1057. CALL WriteLog(MM.PrgName '- *** Error')
  1058. EXIT Value
  1059. RETURN
  1060. AddReplyKludge:
  1061. PARSE ARG Stem
  1062. Kludge=''
  1063. MM_SearchInStem MM.Msg.Head Resp '#?MSGID#?' STR
  1064. IF Resp.Count>0 THEN;DO
  1065. NewKludge=TRANSLATE(Resp.0,'REPLY','MSGID')
  1066. MM_SearchInStem 'MM.'Stem Resp '#?REPLY#?' STR
  1067. IF Resp.Count=0 THEN;DO
  1068. Kludge=NewKludge
  1069. END
  1070. END
  1071. RETURN Kludge
  1072. WritePolicy:PROCEDURE EXPOSE MM.
  1073. PARSE ARG TagName
  1074. IF EXISTS(MM.PolicyPath||MM.Mode'/'TagName) THEN;DO
  1075. MM_ReadStem MM.PolicyPath||MM.Mode'/'TagName MM.YesPolicy APPEND
  1076. CALL WriteMsg(YesPolicy,'Send Policy of Area: 'TagName,'',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1077. END
  1078. ELSE;DO
  1079. IF MM.NoPolicy.Count=0 THEN;DO
  1080. CALL AddLine(NoPolicy,AddReplyKludge(NoPolicy))
  1081. CALL AddLine(NoPolicy,'')
  1082. CALL AddLine(NoPolicy,'  Area:                                 Status:')
  1083. CALL AddLine(NoPolicy,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  1084. END
  1085. MM_SearchInStem MM.NoPolicy Resp '#?'TagName'#?' STR
  1086. IF Resp.Count=0 THEN;DO
  1087. CALL AddLine(NoPolicy,' 'PadR(2,TagName,35)'  'Message(POLICY_NOT_FOUND))
  1088. END
  1089. END
  1090. RETURN
  1091. WriteMsg:PROCEDURE EXPOSE MM.
  1092. PARSE ARG Stem,Reply_Subj,Reply_From,Reply_FromAddr,Reply_To,Reply_ToAddr,Reply_Flags
  1093. CALL AddLine(Stem,'')
  1094. CALL AddLine(Stem,'-+- 'MM.PrgName' (C) 1994-96 By Paolo Carotenuto')
  1095. CALL AddLine(Stem,'')
  1096. MM_WriteStem 'T:MM.AFP.Tmp' 'MM.'Stem
  1097. IF Reply_From='' THEN;DO
  1098. Reply_From='AreaFix'
  1099. IF MM.Mode='RAID' THEN Reply_From='Raid'
  1100. END
  1101. CALL WriteLog('Replying to' Reply_To '- Subj:' Reply_Subj)
  1102. Reply.Subj=Reply_Subj;Reply.From=Reply_From
  1103. Reply.FromAddr=Reply_FromAddr;Reply.To=Reply_To
  1104. Reply.ToAddr=Reply_ToAddr;Reply.Flags=Reply_Flags
  1105. Reply.File='T:MM.AFP.Tmp'
  1106. MM_WriteMsg MM.Mail Reply
  1107. MM_DeleteFile 'T:MM.AFP.Tmp'
  1108. INTERPRET "MM."Stem".Count = 0"
  1109. RETURN
  1110. WriteLog:PROCEDURE EXPOSE MM.
  1111. PARSE ARG Testo
  1112. MM_WriteLog 'Testo' MM.LogLevel
  1113. RETURN
  1114. Init:PROCEDURE EXPOSE MM.
  1115. MM.Extended.Count=0;MM.ExteResc.Count=0;MM.ExteSet.Count=0
  1116. MM.NoPolicy.Count=0;MM.Body.Count=0;MM.Days=0
  1117. MM.ListStatus=FALSE;MM.Status=FALSE;MM.PAStatus=FALSE
  1118. MM.ForceRescan=FALSE;MM.Rescan=FALSE;MM.Query=FALSE
  1119. MM.List=FALSE;MM.Unlinked=FALSE;MM.Help=FALSE;MM.Force=FALSE
  1120. RETURN
  1121. ListaNodi:PROCEDURE EXPOSE MM.
  1122. MM_GetNodes MM.Nodes
  1123. MM_SortAddresses MM.Nodes
  1124. MM_MultiSelReq MM.Nodes MM.NodiResp '"Change Linked Areas For Node"' STR
  1125. RETURN MM.NodiResp.Count
  1126. ListaAree:PROCEDURE EXPOSE MM.
  1127. IF MM.Mode='AREAFIX' THEN;DO
  1128. MM.AreeNodo.Count=0
  1129. DO n=0 FOR MM.Aree.Count
  1130. Tab='  '
  1131. IF IsConnected(MM.Aree.n,MM.NodoResp.0)=TRUE THEN Tab='* '
  1132. Cont=MM.AreeNodo.Count
  1133. MM.AreeNodo.Cont=Tab||MM.Aree.n
  1134. MM.AreeNodo.Count=Cont+1
  1135. END
  1136. MM_MultiSelReq MM.AreeNodo MM.AreeResp '"Change Linked Nodes For Area"' STR
  1137. END
  1138. ELSE MM_MultiSelReq MM.Aree MM.AreeResp '"Change Linked Nodes For Area"' STR
  1139. RETURN MM.AreeResp.Count
  1140. ListaAreeNodo:PROCEDURE EXPOSE MM.
  1141. MM_GetNodeInfo MM.NodoResp.0 Info
  1142. MM.AreeNodo.Count=0
  1143. DO i=0 FOR Info.GroupCount
  1144. IF MM.Force=TRUE THEN Info.GroupLevel.i='255'
  1145. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  1146. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  1147. DO n=0 FOR Aree.Count
  1148. Tab='  '
  1149. IF IsConnected(Aree.n.Area,MM.NodoResp.0)=TRUE THEN Tab='* '
  1150. Tipo=GetAreaType(Aree.n.Area);IF Tipo='MAIL'|Tipo='BAD' THEN ITERATE
  1151. CALL AddLine(AreeNodo,Tab||Aree.n.Area)
  1152. END
  1153. END
  1154. MM_SortStem MM.AreeNodo
  1155. MM_MultiSelReq MM.AreeNodo MM.AreeResp '"Change Linked Nodes For Area"' STR
  1156. RETURN MM.AreeResp.Count
  1157. ListaNodo:PROCEDURE EXPOSE MM.
  1158. MM_GetNodes MM.Nodes
  1159. MM_SortAddresses MM.Nodes
  1160. MM_SingleSelReq MM.Nodes MM.NodoResp '"Change Linked Areas For Node"' STR
  1161. RETURN MM.NodoResp.Count
  1162. ListaAreeLink:PROCEDURE EXPOSE MM.
  1163. MM_GetNodeInfo MM.NodoResp.0 MM.NodoInfo
  1164. IF MM.Mode='AREAFIX' THEN;DO
  1165. MM_SortStem MM.NodoInfo.Area
  1166. MM_MultiSelReq MM.NodoInfo.Area MM.AreeResp '"Change Linked Nodes For Area"' STR
  1167. END
  1168. ELSE;DO
  1169. MM_SortStem MM.NodoInfo.TickArea
  1170. MM_MultiSelReq MM.NodoInfo.TickArea MM.AreeResp '"Change Linked Nodes For Area"' STR
  1171. END
  1172. RETURN MM.AreeResp.Count
  1173. ListaSwitch:PROCEDURE EXPOSE MM.
  1174. MM.Switches.0='List of all Available areas [-L]';MM.Switches.1='List of all Linked areas    [-Q]'
  1175. MM.Switches.2='List of all Unlinked areas  [-U]';MM.Switches.3='List of areas of my UPLINK  [-A]';MM.Switches.4='List of all Areas           [-T]'
  1176. MM.Switches.5='Infos About Node            [-I]';MM.Switches.6='Help Files                  [-H]'
  1177. MM.Switches.Count=7
  1178. MM_MultiSelReq MM.Switches MM.SwitchResp '"Select a Switchs"' STR
  1179. RETURN rc
  1180. ViewDomain:PROCEDURE EXPOSE MM.
  1181. MM_GetAddrs Address
  1182. DO i=0 FOR Address.Count
  1183. PARSE UPPER VAR Address.i '@' Network
  1184. IF UPPER(Network)='VIRTUAL' THEN ITERATE
  1185. MM_SearchInStem MM.Domain Resp Network STR
  1186. IF Resp.Count=0 THEN MM_AddToStem MM.Domain 'Network'
  1187. END
  1188. MM_SortStem MM.Domain
  1189. MM_SingleSelReq MM.Domain MM.DomainResp '"Select Domain"' STR
  1190. IF MM.DomainResp.Count=0 THEN RETURN 0
  1191. MM_GetNodes MM.AllNode
  1192. MM.Nodes.Count=0
  1193. DO i=0 FOR MM.AllNode.Count
  1194. PARSE VAR MM.AllNode.i . '@' Domain
  1195. IF UPPER(STRIP(Domain))=UPPER(STRIP(MM.DomainResp.0)) THEN;DO
  1196. Nodo=MM.AllNode.i
  1197. MM_AddToStem MM.Nodes 'Nodo'
  1198. END
  1199. END
  1200. MM_SortAddresses MM.Nodes
  1201. MM_MultiSelReq MM.Nodes MM.NodiResp '"Change Linked Areas For Node"' STR
  1202. IF MM.NodiResp.Count=0 THEN RETURN 0
  1203. IF MM.Mode='AREAFIX' THEN MM_GetAreas MM.Aree ECHO
  1204. ELSE MM_GetTickAreas MM.Aree
  1205. xAree.Count=0
  1206. DO i=0 FOR MM.Aree.Count
  1207. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo MM.Aree.i Info
  1208. ELSE MM_GetTickAreaInfo MM.Aree.i Info
  1209. PARSE VAR Info.Addr . '@' xDomain
  1210. Area=MM.Aree.i
  1211. IF UPPER(MM.DomainResp.0)=UPPER(xDomain) THEN MM_AddToStem xAree 'Area'
  1212. END
  1213. MM.SortStem xAree
  1214. MM_MultiSelReq xAree MM.AreeResp '"Change Linked Nodes For Area"' STR
  1215. RETURN MM.AreeResp.Count
  1216. Usage:PROCEDURE EXPOSE MM.
  1217. SAY ''
  1218. SAY 'MM_AreaFixPlus (C) 1994-96 By Paolo Carotenuto'
  1219. SAY ''
  1220. SAY 'Usage:'
  1221. SAY '> Rx MM_AreaFixPlus <MUI>'
  1222. SAY '> Rx MM_AreaFixPlus <MSG MailArea Message_Number>'
  1223. SAY '> Rx MM_AreaFixPlus <WRITEPOLICY MailArea Message_Number>'
  1224. SAY '> Rx MM_AreaFixPlus <Node@Domain> <Mode> <-/+Tagname|Cmd> <MailArea> [<-Switch>]'
  1225. SAY ''
  1226. SAY ' MUI         - Use Only if MM is Running'
  1227. SAY ' MSG         - Process Message #number in Mail Area'
  1228. SAY ' WRITEPOLICY - Write Policy Automagically'
  1229. SAY ''
  1230. SAY ' Mode        - Select Areafix (For Echomail) or Raid (for Files)'
  1231. SAY ''
  1232. SAY 'Cmd:'
  1233. SAY ''
  1234. SAY ' INACTIVE  - Turn Off Areas for Node'
  1235. SAY ' ACTIVE    - Activate all Areas for Node'
  1236. SAY '             [When using Inactive|Active you must not use any -Switch]'
  1237. SAY ''
  1238. SAY ' -ALL      - Unlink all Areas for Node'
  1239. SAY ' +ALL      - Link all Areas for Node'
  1240. SAY ''
  1241. SAY ' INFO      - Infos About the Node'
  1242. SAY ' AVAIL     - To Send the List of areas oft my UPLINK'
  1243. SAY ' HELP      - To Send the Help Files'
  1244. SAY ' NONE      - Use this if you want to use Switches'
  1245. SAY ''
  1246. SAY 'Summary of Switches:'
  1247. SAY ' -L        - List of all Available areas'
  1248. SAY ' -Q        - List of all Linked areas'
  1249. SAY ' -U        - List of all Unlinked areas'
  1250. SAY ' -T        - List of all Areas of Totals Network'
  1251. SAY ' -H        - Help File'
  1252. SAY ' -I        - Infos About the Node'
  1253. SAY ' -A        - To Send the List of areas of my UPLINK'
  1254. SAY ' -P        - To Send Policy of Areas'
  1255. SAY ' -R        - Rescan of <Tagname> (Only for EchoMail)'
  1256. SAY ' -FR       - ForceRescan of <Tagname> (Only for EchoMail)'
  1257. SAY ''
  1258. EXIT
  1259. RETURN
  1260. SysopName:PROCEDURE EXPOSE MM.
  1261. PARSE ARG Node
  1262. MM_GetNodelistNode Node NodeInfo
  1263. IF Rc=0 THEN;DO
  1264. RETURN NodeInfo.Sysop
  1265. END
  1266. RETURN 'Sysop On' Node
  1267. MuiCli:PROCEDURE EXPOSE MM.
  1268. IF UPPER(MM.Node)='WRITEPOLICY' THEN;DO
  1269. MM.Mail=MM.Mode;MM_ReadMsg MM.Mail MM.Command Msg
  1270. MM.Alias.0='Areafix';MM.Alias.1='Raid';MM.Alias.Count=2
  1271. MM_SingleSelReq MM.Alias Resp '"Select One Mode"' STR
  1272. IF Resp.Count=0 THEN CALL Fine2()
  1273. MM.Mode=Resp.0
  1274. MM_WriteStem MM.PolicyPath||MM.Mode'/'MM.Mail Msg.Text
  1275. CALL Fine2()
  1276. END
  1277. IF UPPER(MM.Node)='MSG' THEN;DO
  1278. MM.Mail=MM.Mode;MM_ReadMsg MM.Mail MM.Command Msg
  1279. Type=STRIP(Msg.To);MM_SearchInStem MM.AliasAreaFix Resp Type STR
  1280. IF Resp.Count>0 THEN MM.Mode='AREAFIX'
  1281. ELSE;DO;MM_SearchInStem MM.AliasRaid Resp Type STR;IF Resp.Count>0 THEN;DO;MM.Mode='RAID';END;ELSE RETURN;END
  1282. CALL ProcessaMsg(MM.Command);CALL Fine2()
  1283. END
  1284. IF UPPER(MM.Node)='MUI' THEN;DO
  1285. MM.Type.0='Work On EchoMail Areas';MM.Type.1='Work On Files (.TIC) Areas'
  1286. MM.Type.Count=2
  1287. MM_SingleSelReq MM.Type MM.ModeResp '"'MM.PrgName'"' STR
  1288. IF MM.ModeResp.Count=0 THEN CALL Fine2()
  1289. IF MM.Mails.Count>1 THEN;DO
  1290. MM_SingleSelReq MM.Mails MM.MailResp '"Select one MailArea"' STR
  1291. IF MM.MailResp.Count=0 THEN EXIT
  1292. MM.Mail=MM.MailResp.0
  1293. END
  1294. ELSE MM.Mail=MM.Mails.0
  1295. SELECT
  1296. WHEN MM.ModeResp.0=MM.Type.0 THEN;DO
  1297. MM_GetAreas MM.Aree ECHO
  1298. MM.Mode='AREAFIX'
  1299. MM.Commands.count=12
  1300. MM.ModeRescan.0='Normal Rescan';MM.ModeRescan.1='Force Rescan'
  1301. MM.ModeRescan.Count=2
  1302. END
  1303. WHEN MM.ModeResp.0=MM.Type.1 THEN;DO
  1304. MM_GetTickAreas MM.Aree
  1305. MM.Mode='RAID'
  1306. MM.Commands.count=10
  1307. END
  1308. OTHERWISE NOP
  1309. END
  1310. MM_SortStem MM.Aree
  1311. MM.Commands.0='Edit Links';MM.Commands.1='Force Edit Links'
  1312. MM.Commands.2='Edit Single UnLinks';MM.Commands.3='Edit Multiple UnLinks'
  1313. MM.Commands.4='Inactive Node';MM.Commands.5='Active Node'
  1314. MM.Commands.6='-ALL Node';MM.Commands.7='+ALL Node'
  1315. MM.Commands.8='Send Policy to Node';MM.Commands.9='NO Command (use only Switchs)'
  1316. MM.Commands.10='Rescan All Linked Area';MM.Commands.11='Rescan Multiple Node'
  1317. DO FOREVER
  1318. CALL Init()
  1319. MM_SingleSelReq MM.Commands MM.CommResp '"Select One Command"' STR
  1320. IF MM.CommResp.Count=0 THEN LEAVE
  1321. SELECT
  1322. WHEN MM.CommResp.0=MM.Commands.0 THEN;DO
  1323. IF ListaNodo()=0 THEN ITERATE
  1324. IF ListaAreeNodo()=0 THEN ITERATE
  1325. CALL ListaSwitch()
  1326. MM.FromName=SysopName(MM.NodoResp.0)
  1327. MM.FromNode=MM.NodoResp.0
  1328. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1329. DO h=0 FOR MM.AreeResp.Count
  1330. CALL PrintAree(Body,MM.AreeResp.h,Message(ConnectArea(STRIP(TRANSLATE(MM.AreeResp.h,' ','*')),MM.NodoResp.0)))
  1331. END
  1332. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1333. DO w=0 FOR MM.SwitchResp.Count
  1334. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1335. END
  1336. END
  1337. WHEN MM.CommResp.0=MM.Commands.1 THEN;DO
  1338. MM.Force=TRUE
  1339. IF ListaNodo()=0 THEN ITERATE
  1340. IF ListaAreeNodo()=0 THEN ITERATE
  1341. CALL ListaSwitch()
  1342. MM.FromName=SysopName(MM.NodoResp.0)
  1343. MM.FromNode=MM.NodoResp.0
  1344. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1345. DO h=0 FOR MM.AreeResp.Count
  1346. CALL PrintAree(Body,MM.AreeResp.h,Message(ConnectArea(STRIP(TRANSLATE(MM.AreeResp.h,' ','*')),MM.NodoResp.0)))
  1347. END
  1348. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1349. DO w=0 FOR MM.SwitchResp.Count
  1350. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1351. END
  1352. END
  1353. WHEN MM.CommResp.0=MM.Commands.2 THEN;DO
  1354. IF ListaNodo()=0 THEN ITERATE
  1355. IF ListaAreeLink()=0 THEN ITERATE
  1356. CALL ListaSwitch()
  1357. MM.FromName=SysopName(MM.NodoResp.0)
  1358. MM.FromNode=MM.NodoResp.0
  1359. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1360. DO h=0 FOR MM.AreeResp.Count
  1361. CALL PrintAree(Body,MM.AreeResp.h,Message(DisConnectArea(MM.AreeResp.h,MM.NodoResp.0)))
  1362. END
  1363. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1364. DO w=0 FOR MM.SwitchResp.Count
  1365. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1366. END
  1367. END
  1368. WHEN MM.CommResp.0=MM.Commands.3 THEN;DO
  1369. IF ViewDomain()=0 THEN ITERATE
  1370. CALL ListaSwitch()
  1371. DO f=0 FOR MM.NodiResp.Count
  1372. MM.FromName=SysopName(MM.NodiResp.f)
  1373. MM.FromNode=MM.NodiResp.f
  1374. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1375. DO h=0 FOR MM.AreeResp.Count
  1376. CALL PrintAree(Body,MM.AreeResp.h,Message(DisConnectArea(MM.AreeResp.h,MM.NodiResp.f)))
  1377. END
  1378. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1379. DO w=0 FOR MM.SwitchResp.Count
  1380. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1381. END
  1382. MM.Status=FALSE
  1383. END
  1384. END
  1385. WHEN MM.CommResp.0=MM.Commands.4 THEN;DO
  1386. IF ListaNodi()=0 THEN ITERATE
  1387. DO h=0 FOR MM.NodiResp.Count
  1388. MM.FromName=SysopName(MM.NodiResp.h)
  1389. MM.FromNode=MM.NodiResp.h
  1390. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1391. CALL Extended(MM.NodiResp.h,'%INACTIVE')
  1392. MM.Status=FALSE
  1393. END
  1394. END
  1395. WHEN MM.CommResp.0=MM.Commands.5 THEN;DO
  1396. IF ListaNodi()=0 THEN ITERATE
  1397. DO h=0 FOR MM.NodiResp.Count
  1398. MM.FromName=SysopName(MM.NodiResp.h)
  1399. MM.FromNode=MM.NodiResp.h
  1400. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1401. CALL Extended(MM.NodiResp.h,'%ACTIVE')
  1402. MM.Status=FALSE
  1403. END
  1404. END
  1405. WHEN MM.CommResp.0=MM.Commands.6 THEN;DO
  1406. IF ListaNodi()=0 THEN ITERATE
  1407. CALL ListaSwitch()
  1408. DO h=0 FOR MM.NodiResp.Count
  1409. MM.FromName=SysopName(MM.NodiResp.h)
  1410. MM.FromNode=MM.NodiResp.h
  1411. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1412. CALL Extended(MM.NodiResp.h,'%-ALL')
  1413. DO w=0 FOR MM.SwitchResp.Count
  1414. CALL GoSwitch(MM.NodiResp.h,MM.SwitchResp.w)
  1415. END
  1416. MM.Status=FALSE
  1417. END
  1418. END
  1419. WHEN MM.CommResp.0=MM.Commands.7 THEN;DO
  1420. IF ListaNodi()=0 THEN ITERATE
  1421. CALL ListaSwitch()
  1422. DO h=0 FOR MM.NodiResp.Count
  1423. MM.FromName=SysopName(MM.NodiResp.h)
  1424. MM.FromNode=MM.NodiResp.h
  1425. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1426. CALL Extended(MM.Node,'%+ALL')
  1427. DO w=0 FOR MM.SwitchResp.Count
  1428. CALL GoSwitch(MM.NodiResp.h,MM.SwitchResp.w)
  1429. END
  1430. MM.Status=FALSE
  1431. END
  1432. END
  1433. WHEN MM.CommResp.0=MM.Commands.8 THEN;DO
  1434. IF ViewDomain()=0 THEN ITERATE
  1435. DO f=0 FOR MM.NodiResp.Count
  1436. MM.FromName=SysopName(MM.NodiResp.f)
  1437. MM.FromNode=MM.NodiResp.f
  1438. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1439. DO h=0 FOR MM.AreeResp.Count
  1440. CALL WritePolicy(MM.AreeResp.h)
  1441. END
  1442. MM.Status=FALSE
  1443. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1444. END
  1445. END
  1446. WHEN MM.CommResp.0=MM.Commands.9 THEN;DO
  1447. IF ListaNodi()=0 THEN ITERATE
  1448. CALL ListaSwitch()
  1449. DO f=0 FOR MM.NodiResp.Count
  1450. MM.FromName=SysopName(MM.NodiResp.f)
  1451. MM.FromNode=MM.NodiResp.f
  1452. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1453. DO w=0 FOR MM.SwitchResp.Count
  1454. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1455. END
  1456. MM.Status=FALSE
  1457. END
  1458. END
  1459. WHEN MM.CommResp.0=MM.Commands.10 THEN;DO
  1460. MM_SingleSelReq MM.ModeRescan MM.CommResp '"Select One Mode"' STR
  1461. IF MM.CommResp.Count=0 THEN ITERATE
  1462. IF MM.CommResp.0=MM.ModeRescan.1 THEN MM.ActionForce=TRUE
  1463. IF ListaNodi()=0 THEN ITERATE
  1464. CALL ListaSwitch()
  1465. DO f=0 FOR MM.NodiResp.Count
  1466. MM.FromName=SysopName(MM.NodiResp.f)
  1467. MM.FromNode=MM.NodiResp.f
  1468. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1469. MM_GetNodeInfo MM.NodiResp.f Info
  1470. DO i=0 FOR Info.GroupCount
  1471. MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  1472. DO n=0 FOR Aree.Count
  1473. IF GetAreaType(Aree.n.Area)='MAIL' THEN ITERATE
  1474. IF IsConnected(Aree.n.Area,MM.NodiResp.f)=TRUE THEN CALL PrintAree(Body,Aree.n.Area,Message(Rescan(MM.NodiResp.f,Aree.n.Area)))
  1475. END
  1476. END
  1477. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1478. DO w=0 FOR MM.SwitchResp.Count
  1479. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1480. END
  1481. MM.Status=FALSE
  1482. END
  1483. END
  1484. WHEN MM.CommResp.0=MM.Commands.11 THEN;DO
  1485. MM_SingleSelReq MM.ModeRescan MM.CommResp '"Select One Mode"' STR
  1486. IF MM.CommResp.Count=0 THEN ITERATE
  1487. IF MM.CommResp.0=MM.ModeRescan.1 THEN MM.ActionForce=TRUE
  1488. IF ViewDomain()=0 THEN ITERATE
  1489. CALL ListaSwitch()
  1490. DO f=0 FOR MM.NodiResp.Count
  1491. MM.FromName=SysopName(MM.NodiResp.f)
  1492. MM.FromNode=MM.NodiResp.f
  1493. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1494. DO h=0 FOR MM.AreeResp.Count
  1495. LinkArea=STRIP(TRANSLATE(MM.AreeResp.h,' ','*'))
  1496. CALL PrintAree(Body,MM.AreeResp.h,Message(Rescan(MM.NodiResp.f,LinkArea)))
  1497. END
  1498. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1499. DO w=0 FOR MM.SwitchResp.Count
  1500. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1501. END
  1502. MM.Status=FALSE
  1503. END
  1504. END
  1505. OTHERWISE NOP
  1506. END
  1507. END
  1508. CALL Fine()
  1509. END
  1510. PARSE VALUE FindAddr(MM.Node) WITH MM.Address .
  1511. MM.FromName=SysopName(MM.Node)
  1512. IF INDEX(UPPER(MM.FromName),'SYSOP ON')=0 THEN MM.FromFirst=SUBWORD(MM.FromName,1)
  1513. ELSE MM.FromFirst=MM.FromName
  1514. MM.FromNode=MM.Node;MM.Switch=UPPER(MM.Switch)
  1515. MM.Mode=UPPER(MM.Mode);MM.ToNode=MM.Address;MM.Command=UPPER(MM.Command)
  1516. CALL Init()
  1517. SELECT
  1518. WHEN MM.Command='INACTIVE' THEN CALL Extended(MM.Node,'%INACTIVE')
  1519. WHEN MM.Command='ACTIVE' THEN CALL Extended(MM.Node,'%ACTIVE')
  1520. WHEN MM.Command='+ALL' THEN CALL Extended(MM.Node,'%+ALL')
  1521. WHEN MM.Command='-ALL' THEN CALL Extended(MM.Node,'%-ALL')
  1522. WHEN MM.Command='INFO' THEN CALL Extended(MM.Node,'%INFO')
  1523. WHEN MM.Command='AVAIL' THEN CALL Extended(MM.Node,'%AVAIL')
  1524. WHEN MM.Command='HELP' THEN CALL Extended(MM.Node,'%HELP')
  1525. WHEN LEFT(MM.Command,1)='+' THEN;DO
  1526. IF MM.Mode='AREAFIX' THEN;DO
  1527. IF INDEX(MM.Switch,'-R') ~=0 THEN MM.Rescan=TRUE
  1528. IF INDEX(MM.Switch,'-FR') ~=0 THEN MM.ForceRescan=TRUE
  1529. END
  1530. SAY MM.PrgName '-' MM.Node MM.Command ConnectArea(STRIP(TRANSLATE(MM.Command,' ','+')),MM.Node)
  1531. END
  1532. WHEN LEFT(MM.Command,1)='-' THEN SAY MM.PrgName '-' MM.Node MM.Command DisconnectArea(STRIP(TRANSLATE(MM.Command,' ','-')),MM.Node)
  1533. OTHERWISE NOP
  1534. END
  1535. IF MM.Body.Count>=1 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1536. IF MM.Command='INACTIVE'|MM.Command='ACTIVE' THEN;DO
  1537. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1538. Fine2()
  1539. END
  1540. CALL GoSwitch(MM.Node,MM.Switch)
  1541. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1542. CALL Fine2()
  1543. RETURN
  1544. GoSwitch:PROCEDURE EXPOSE MM.
  1545. PARSE ARG Nodo,Line
  1546. IF INDEX(Line,'-Q') ~=0 THEN CALL Extended(Nodo,'%Q');IF INDEX(Line,'-L') ~=0 THEN CALL Extended(Nodo,'%L')
  1547. IF INDEX(Line,'-U') ~=0 THEN CALL Extended(Nodo,'%U');IF INDEX(Line,'-I') ~=0 THEN CALL Extended(Nodo,'%I')
  1548. IF INDEX(Line,'-H') ~=0 THEN CALL Extended(Nodo,'%H');IF INDEX(Line,'-P') ~=0 THEN CALL Extended(Nodo,'%P')
  1549. IF INDEX(Line,'-A') ~=0 THEN CALL Extended(Nodo,'%A');IF INDEX(Line,'-T') ~=0 THEN CALL Extended(Nodo,'%T')
  1550. RETURN